// Copyright 1998,1999 Macromedia, Inc. All rights reserved.



//Constructs a multiple choice element

function MM_inpt(theParent, theName, theInitialValue,

                 theExpectedValue, theIsCorrect, theScore) {

  // properties

  this.initialValue = theInitialValue;

  this.value = '';

  this.disabled = true;

  

  this.expectedValue = theExpectedValue;

  this.isCorrect = theIsCorrect;

  this.score = theScore;

  this.selected = false;

  

  this.isRadioList = false;

  

  this._parent = theParent;

  this._name = theName;

  this._obj = '';

  

  this.c = new Array(this); // NOTE: choice info stored on the element.



  // member functions

  this.init = MM_inptInit;

  this.reset = MM_inptReset;

  this.enable = MM_inptEnable;

  this.disable = MM_inptDisable;

  this.update = MM_inptUpdate;

  this.setDisabled = MM_inptSetDisabled;

  this.redraw = MM_inptRedraw;

  this.validValue = MM_inptValidValue;

  this.setValue = MM_inptSetValue;

  this.setSelected = MM_inptSetSelected;

  this.changeValue = MM_inptChangeValue;

}



// Initializes the element, special case radio lists

function MM_inptInit() {

  var rlist, i, pos=0;

  with (this) { 

    _obj = MM_intFindObject(_parent._self + _name + "Inp");

    if (!_obj) { // assume radio

      rlist = MM_intFindObject(_parent._self + "RadioInp");

      if (rlist && rlist.length != null) {

          for (i in _parent.e) if (i != 'length') // get our element position

            if (_parent.e[i] == this) break; else pos++;

          if (pos < rlist.length) _obj = rlist[pos];  // get radio at same position

          isRadioList = true;

  } } } 

}



//Resets the element

function MM_inptReset() {

  var isChanged = '';

  with (this) {

    isChanged = (value != initialValue);

    value = initialValue;

    _parent.disabled ? disable() : enable();

    validValue();

    redraw();

    if (isChanged && this.onChange != null) onChange(_parent._self+_name, value);

  }

}



//Enables the element

function MM_inptEnable() {

  if (this._obj) with (this) {

    disabled = false;

    redraw();

  }

}



//Calls the approppriate disable or enable function

function MM_inptSetDisabled(theDisabled) {

  if (theDisabled) this.disable();

  else this.enable();

}



//Disables the element

function MM_inptDisable() {

  this.disabled = true;

  this.redraw();

}



//Called by onClick event to update this elements value

function MM_inptUpdate() {

  var noJudge = false;

  with (this) {

    if (disabled) {

      if (!isRadioList) 

        redraw();

      else

        for (var i in _parent.e) if (i != 'length')

          _parent.e[i].redraw();

      return;

    }

  

    if (_obj.checked != null) {

      if (isRadioList && value == _obj.checked) noJudge = true; //IE3.0 oddity

      changeValue((_obj.checked) ? true : false);  //IE3.0 oddity

    } else

      changeValue(_parent.allowMultiSel ? !value : true);

  

    // call the parent's update

    _parent.update(noJudge);

  }

}



//Sets the checked state of the form element

function MM_inptRedraw() {

  if (this._obj) with (this) {

    if (_obj.disabled != null) _obj.disabled = disabled;

    if (isRadioList) {

      if (value) _obj.checked = true;

    } else if (_obj.checked != null) _obj.checked = value;

  }

}



//Checks the value with the expectedValue

function MM_inptValidValue() {

  this.selected = (this.value == this.expectedValue);

  return this.selected;

}



//Internal routine for changing element value

function MM_inptChangeValue(theValue) {

  var i, isChanged = '', isReset = '';

  with (this) {

    isChanged = (value != theValue);

    if (!_parent.allowMultiSel || isRadioList || _obj.type == 'radio') {

      value = theValue;

      for (i in _parent.e) if (i != 'length') with (_parent) {

        if (e[i] != this) {

          isReset = (e[i].value != false);

          e[i].value = false;

        }

        e[i].validValue();

        e[i].redraw();

        if (e[i] != this && isReset && e[i].onChange != null)

          e[i].onChange(e[i]._parent._self+e[i]._name, e[i].value);

      }

    } else {

      value = theValue;

      validValue();

      redraw();

    }

    if (isChanged && this.onChange != null) onChange(_parent._self+_name, value);

  }

}



//Sets the state of the element to the given value

function MM_inptSetValue(theValue) {

  with (this) {

    changeValue(theValue);

    _parent.update(true); // update int, but don't judge

  }

}



//Sets this element to its selected state

function MM_inptSetSelected(theSelected) {

  if (theSelected)

    this.setValue(this.expectedValue);

  else

    this.setValue(!this.expectedValue);

}